package cn.txun.csmall.sentinal.study.func;

import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource;
import com.alibaba.csp.sentinel.datasource.ReadableDataSource;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;

import java.net.URL;
import java.util.List;

/**
 * 读取flow.rules加载到当前项目中
 * 这些特定功能，需要实现一个接口
 */
@Slf4j
public class DataSourceInitFunc implements InitFunc{
    /**
     * 这个初始化方法，将当前项目中能读到的所有规则配置文件
     * 在init中生成，我们自定义的List对象，元素就是对应文件的类型
     * 有限流规则和熔断规则
     * @throws Exception
     */
    @Override
    public void init() throws Exception {
        //日志，观察当前init方法何时加载
        log.info("DataSourceInitFunc.init() 被执行了");
        //读取文件路径,先获取类加载器，在读取resource
        ClassLoader classLoader = DataSourceInitFunc.class.getClassLoader();
        URL resource = classLoader.getResource("flow.rules");
        //从数据文件源URL对象中获取文件的路径file
        String file = resource.getFile();
        //转化json，成为Rule对象
        ReadableDataSource<String,List<FlowRule>> flowDataSource =
                new FileRefreshableDataSource<List<FlowRule>>(
                        file,source-> JSON.parseArray(source,FlowRule.class)
                );
        //加载到sentinel规则中
        //FlowRuleManager.register2Property(flowDataSource.getProperty());
    }
}
